# -*- coding: utf-8 -*-
"""
@auth:sirius
@time:2017.10.26
@topic:Logistic回归模型和梯度下降分类器(SGDC)用于乳腺肿瘤的二分类预测
"""
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import classification_report

'''
加载数据集，了解数据集的规模，特征属性的取值情况等信息
'''
print '将加载的数据对象保存在digits变量'
digits = load_digits()
print 'digits对象是一个Bunch对象，所以输出它的keys看看：'
print digits.keys()
print digits.data.shape

print '检查特征规模和特征维度'
n_samples, n_features = digits.data.shape
print n_samples, n_features
print digits.images.shape

# plt.gray()
# plt.matshow(digits.images[0])
# plt.show()
# 设置画布
fig = plt.figure(figsize=(6, 6)) # 画布尺寸
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)

# 绘制数字，每张图像8*8像素点
for i in range(64):
    ax = fig.add_subplot(8, 8, i+1, xticks=[], yticks=[])
    ax.imshow(digits.images[i], cmap=plt.cm.binary, interpolation='nearest')
    # 用目标值标记图像
    ax.text(0, 7, str(digits.target[i]))

plt.show()

'''
把数据集划分成训练集和测试集
'''
print '使用sklearn.model_selection里的train_test_split划分数据集'
print '随机采样 25% 的数据用来测试， 75% 的数据用于训练'
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=33, stratify=digits.target) # 均匀划分
print '查验训练样本和测试样本的数量和类别分布'
print '训练样本的数量和类别分布'
print np.bincount(y_train)
print '测试样本的数量和类别分布'
print np.bincount(y_test)

'''
训练支持向量机对手写数字进行分类识别
'''
print '标准化数据，使得每个维度的数据的方差为1，均值为0。'
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.fit_transform(X_test)
print '标准化数据运行完毕'

print '初始化线性支持向量分类器'
lsvc = LinearSVC()
print '进行模型训练'
lsvc.fit(X_train, y_train)
print '进行模型预测'
lsvc_pred_test = lsvc.predict(X_test)
print '运行完毕！！！'

'''
对模型的预测性能进行评估
'''
print '使用学习器模型自带的score函数获得模型在测试集上的准确率'
lsvc_accuracy = lsvc.score(X_test, y_test)
print '线性支持向量分类器的分类准确率是：%f' % lsvc_accuracy
print '利用classification_report获得其他三个评估指标'
lsvc_report = classification_report(y_test, lsvc_pred_test, target_names=digits.target_names.astype(str))
print lsvc_report
